package service

import (
	"admin/config"
	"github.com/go-oauth2/oauth2/v4/server"
	"github.com/redis/go-redis/v9"
	"gorm.io/gorm"
	"net/http"
)

// Container 服务容器，用于依赖注入
type Container struct {
	DB          *gorm.DB
	Redis       *redis.Client
	OAuthServer *server.Server
}

// NewContainer 创建新的服务容器
func NewContainer(cfg *config.Config) (*Container, error) {
	container := &Container{}

	// 初始化 MySQL
	gdb, err := InitDB(&cfg.MySQL)
	if err != nil {
		return nil, err
	}
	container.DB = gdb

	// 初始化 Redis
	redisClient, err := InitRedis(&cfg.Redis)
	if err != nil {
		return nil, err
	}
	container.Redis = redisClient

	// 初始化 OAuth2 Server
	oauthServer, err := InitOAuth2(container.DB, &cfg.OAuth2)
	if err != nil {
		return nil, err
	}
	container.OAuthServer = oauthServer

	return container, nil
}

// Close 关闭所有服务连接
func (c *Container) Close() error {
	if c.DB != nil {
		sqlDB, err := c.DB.DB()
		if err != nil {
			return err
		}
		sqlDB.Close()
	}

	if c.Redis != nil {
		c.Redis.Close()
	}

	return nil
}

// HandleTokenRequest 处理 Token 请求
func (c *Container) HandleTokenRequest(w http.ResponseWriter, r *http.Request) error {
	return HandleTokenRequest(c.OAuthServer, w, r)
}
